home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / Borland / Borland C++ V5.02 / DOCVIEW.PAK / DVLOADER.CPP < prev    next >
C/C++ Source or Header  |  1997-05-06  |  3KB  |  111 lines

  1. //----------------------------------------------------------------------------
  2. // ObjectWindows
  3. // Copyright (c) 1993, 1995 by Borland International, All Rights Reserved
  4. //
  5. //   Provides TModuleDoc class to dynamically load new document/view classes
  6. //----------------------------------------------------------------------------
  7. #include <owl/pch.h>
  8. #include <owl/docmanag.h>
  9. #include "dvloader.rc"
  10.  
  11. class TModuleDocument : public TDocument {
  12.   public:
  13.     TModuleDocument(TDocument* parent=0) : TDocument(parent), Module(0) {}
  14.    ~TModuleDocument() { Close(); }
  15.     bool   Open(int mode, const char far* path=0);
  16.     bool   Close();
  17.     bool   IsOpen() { return Module != 0; }
  18.   protected:
  19.     TModule* Module;
  20.  
  21.   DECLARE_STREAMABLE(, TModuleDocument,1);
  22. };
  23.  
  24. class TModuleView : public TView {
  25.   public:
  26.     TModuleView(TDocument& doc, TWindow* parent = 0) : TView(doc) {
  27.       doc.GetDocManager().PostDocError(doc, IDS_DVLOADED);
  28.       NotOK();
  29.     }
  30.     static LPCSTR StaticName() {return "Module View";}
  31.     LPCSTR GetViewName() {return StaticName();}
  32. };
  33.  
  34. bool TModuleDocument::Open(int /*mode*/, const char far* path)
  35. {
  36.   if (IsOpen())
  37.     return true;
  38.   if (path)
  39.     SetDocPath(path);
  40.   if (!GetDocPath())
  41.     return false;
  42.   try {
  43.     Module = new TModule(GetDocPath());
  44.   }
  45.   catch(TXOwl&) {
  46.     return false;
  47.   }
  48.   TDocTemplate** tplhead;
  49.   TDocTemplate** PASCAL(*entry)(int version);
  50.   (FARPROC)entry = Module->GetProcAddress("GetDocTemplateHead");
  51.   if (!entry || (tplhead = entry(OWLVersion)) == 0) {
  52.     delete Module;
  53.     Module = 0;
  54.     return false;
  55.   }
  56.   TDocTemplate* tpl = *tplhead;
  57.   for (; tpl; tpl = GetDocManager().GetNextTemplate(tpl)) 
  58.     tpl->Clone(Module)->SetDocManager(&GetDocManager());
  59.   return true;
  60. }
  61.  
  62. bool TModuleDocument::Close()
  63. {
  64.   if (!IsOpen())
  65.     return true;
  66.   TDocTemplate* tpl;
  67.   TDocTemplate* next;
  68.   for (tpl = GetDocManager().GetNextTemplate(0); tpl; tpl = next) {
  69.     next = GetDocManager().GetNextTemplate(tpl);
  70.     if (*tpl->GetModule() == *Module) {
  71.       // must remove any remaining associated documents before freeing module
  72.       TDocument* doc;
  73.       TDocument* next;
  74.       for (doc = GetDocManager().DocList.Next(0); doc; doc = next) {
  75.         next = GetDocManager().DocList.Next(doc);
  76.         if (doc->GetTemplate() == tpl){
  77.           doc->Close();
  78.           delete doc;
  79.         }
  80.       }
  81.       GetDocManager().DeleteTemplate(*tpl);  // RefCnt should go to 0 now
  82.     }
  83.   }
  84.   delete Module;
  85.   Module = 0;
  86.   return true;  
  87. }
  88.  
  89. IMPLEMENT_STREAMABLE1(TModuleDocument, TDocument);
  90.  
  91. void*
  92. TModuleDocument::Streamer::Read(ipstream& is, uint32 /*version*/) const
  93. {
  94.   ReadBaseObject((TDocument*)GetObject(), is);
  95.   is >> GetObject()->Module;
  96.   return GetObject();
  97. }
  98.  
  99. void
  100. TModuleDocument::Streamer::Write(opstream& os) const
  101. {
  102.   WriteBaseObject((TDocument*)GetObject(), os);
  103.   os << GetObject()->Module;
  104. }
  105.  
  106. DEFINE_DOC_TEMPLATE_CLASS(TModuleDocument, TModuleView, LoadTemplate);
  107. LoadTemplate loadTpl("DocView Components (*.DVC)","*.dvc",0,0,
  108.                      dtAutoOpen|dtUpdateDir|dtReadOnly|dtHideReadOnly);
  109.  
  110.  
  111.